import { cloneDeep } from "lodash-es"
import { ContentTypeEnum } from "@/enums/httpEnums"
import { checkStatus } from "./checkStatus"
import { clone } from "lodash-es"
import { VAxios } from "./Axios"
import { useMessage } from '@/hooks/useMessage';


const { createMessage } = useMessage();

/**
 * @description: 数据处理，方便区分多种处理方式
 */
const transform = {
    // 请求之前处理config
    beforeRequestHook: (config, options) => {
        return config;
    },

    // 处理响应数据。如果数据不是预期格式，可直接抛出错误
    transformResponseHook: (res, options) => {
        const { isTransformResponse, isReturnNativeResponse } = options;
        // 是否返回原生响应头 比如：需要获取响应头时使用该属性
        if (isReturnNativeResponse) {
            return res;
        }
        // 用于页面代码可能需要直接获取code，data，message这些信息时开启
        if (isTransformResponse) {
            return res.data;
        }
        return res;
    },

    // 请求拦截器处理
    requestInterceptors: (config, _options) => {
        const token = localStorage.getItem('token')
        if (token && config?.requestOptions?.withToken !== false) {
            config.headers.Authorization = token;
        }
        return config
    },
    // 响应拦截器处理
    responseInterceptors: response => {
        return response;
    },
    // 响应错误处理
    responseInterceptorsCatch: (axiosInstance, error) => {
        const { response, code, message, config } = error || {};
        const errorMessageMode = config?.requestOptions?.errorMessageMode || 'none';
        const msg = response?.data?.error?.message ?? '';
        const err = error?.toString?.() ?? '';
        // 错误消息
        let errMessage = '';
        try {
            if (code === 'ECONNABORTED' && message.indexOf('timeout') !== -1) {
                errMessage = '接口请求超时,请刷新页面重试!';
            }
            if (err?.includes('Network Error')) {
                errMessage = '网络异常，请检查您的网络连接是否正常!';
            }
            if (errMessage) {
                if (errorMessageMode === 'message') {
                    createMessage({ content: errMessage, type: 'error', duration: 1 });
                }
                return Promise.reject(error);
            }
        } catch (err) {
            throw new Error(err);
        }
        checkStatus(response?.status, msg, errorMessageMode);

        return Promise.reject(error);
    }
};

function createRequest(opt) {
    return new VAxios(
        cloneDeep(
            {
                timeout: 30 * 1000,
                // baseURL: "https://capturetest.bigquant.com",
                header: {
                    'Content-Type': ContentTypeEnum.JSON,
                },
                // 数据处理方式
                transform: clone(transform),
                // 配置项，下面的选项都可以在独立的接口请求中覆盖
                requestOptions: {
                    withToken: false,   // 请求头是否携带token
                    errorMessageMode: 'message',    // 消息提示类型
                    isTransformResponse: true,      // 需要对返回数据进行处理   直接获取code，data，message这些信息
                    isReturnNativeResponse: false,      // 是否返回原生响应头 比如：需要获取响应头时使用该属性
                    ignoreCancelToken: true,      // 忽略重复请求
                },
            },
            opt || {},
        )
    )
}
export const defHttp = createRequest();
